const fs = require('node:fs')
const fs2 = require('node:fs/promises')

// 1.读取文件 readFile
//异步
fs.readFile('./index.txt', {encoding: 'utf-8', flag: 'r'}, (error, data) => {
    if (error) throw error
    console.log(data)
})

//同步
let result = fs.readFileSync('./index.txt')  //result为buffer
console.log(result.toString())

// promise版本
fs2.readFile('./index.txt').then(res=>{
    console.log(res.toString())
})

// 2.可读流 createReadStream
// 处理大文件的时候会用
const readStream = fs.createReadStream('./index.txt')
readStream.on('data',(chunk)=>{
    console.log(chunk.toString())
})

readStream.on('end',()=>{
    console.log('end')
})


// 3.创建文件夹
// fs.mkdirSync('./test')
// 递归创建多层文件夹p
fs.mkdirSync('./test/test1/test2/test3',{recursive: true})

// 4.删除
// fs.rmSync('./test')
// 递归删除
fs.rmSync('./test', {recursive: true})

// 5.rename 重命名文件
// fs.renameSync('./index.txt', 'index2.txt')

// 6.watch 监听文件的变化
fs.watch('./write.txt', (event, filename)=>{
    console.log('文件发生变化', event, filename)
})

// 7.writeFileSync 写入文件
// 第一个参数写入的文件
// 第二个参数写入的内容
// 第三个是options可选项 encoding编码, mode权限, flag写入方式
// 'a': 打开文件进行追加。 如果文件不存在，则创建该文件。
// 'ax': 类似于'a'但如果路径存在则失败。
// 'a+': 打开文件进行读取和追加。 如果文件不存在，则创建该文件。
// 'ax+': 类似于'a+'但如果路径存在则失败。
// 'as': 以同步模式打开文件进行追加。 如果文件不存在，则创建该文件。
// 'as+': 以同步模式打开文件进行读取和追加。 如果文件不存在，则创建该文件。
// 'r': 打开文件进行读取。 如果文件不存在，则会发生异常。
// 'r+': 打开文件进行读写。 如果文件不存在，则会发生异常。
// 'rs+': 以同步模式打开文件进行读写。 指示操作系统绕过本地文件系统缓存。
// 这主要用于在 NFS 挂载上打开文件，因为它允许跳过可能过时的本地缓存。 它对 I/O 性能有非常实际的影响，因此除非需要，否则不建议使用此标志。
// 这不会将fs.open()或fsPromises.open()变成同步阻塞调用。 如果需要同步操作，应该使用类似fs.openSync()的东西。
// 'w': 打开文件进行写入。 创建（如果它不存在）或截断（如果它存在）该文件。
// 'wx': 类似于'w'但如果路径存在则失败。
// 'w+': 打开文件进行读写。 创建（如果它不存在）或截断（如果它存在）该文件。
// 'wx+': 类似于'w+'但如果路径存在则失败。
fs.writeFileSync('./write.txt', 'java之父\n', {
    flag: 'a' // 内容追加模式（append）
})

fs.appendFileSync('./write.txt', 'asdfjkl;')

// 8.创建可写流（大量数据分批插入）
let writeStream = fs.createWriteStream('./write.txt')
let text = [
    'asdf',
    'jkl;',
    '1234'
]

text.forEach(item =>{
    writeStream.write(item + '\n')
})

writeStream.end()

writeStream.on('finish', ()=>{
    console.log('写入完成')
})

// 9.软链接和硬链接
// 硬链接, 可用于备份文件, 原始文件被删除，硬链接文件不会被删除，但是会同步修改
fs.linkSync('./index.txt', './index2.txt')

// 软链接, 像Windows的快捷方式， 需要管理员权限
fs.symlinkSync('./index.txt', './index3.txt')